package cn.iocoder.yudao.module.trade.statistics.service;

import cn.iocoder.yudao.framework.business.basic.pojo.bo.DataComparison;
import cn.iocoder.yudao.module.api.trade.statistics.dto.TradeOrderAreaStatisticsRespDTO;
import cn.iocoder.yudao.module.trade.statistics.bo.TradeOrderMemberRankingRespBO;
import cn.iocoder.yudao.module.trade.statistics.bo.TradeOrderProductRankingRespBO;
import cn.iocoder.yudao.module.trade.statistics.bo.TradeOrderSummaryRespBO;
import cn.iocoder.yudao.module.trade.statistics.vo.TradeOrderSummaryRespVO;
import cn.iocoder.yudao.module.trade.statistics.vo.TradeOrderTrendReqVO;
import cn.iocoder.yudao.module.trade.statistics.vo.TradeOrderTrendRespVO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 交易订单的统计 Service 实现类
 *
 * @author owen
 */
public interface TradeOrderStatisticsService {

    /**
     * 获取订单统计
     *
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @return 订单统计结果
     */
    TradeOrderSummaryRespBO getOrderSummary(LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 获取地区订单统计
     *
     * @return 订单统计结果
     */
    List<TradeOrderAreaStatisticsRespDTO> getSummaryListByGroupAreaId();

    /**
     * 获取下单用户数量
     *
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @return 下单用户数量
     */
    Integer getOrderUserCount(LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 获取支付用户数量
     *
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @return 支付用户数量
     */
    Integer getPayUserCount(LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 获取支付金额
     *
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @return 支付用户金额
     */
    Integer getOrderPayPrice(LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 根据订单状态、物流类型，获得交易订单数量
     *
     * @return 订单数量
     */
    Long getCountByStatusAndDeliveryType(Integer status, Integer deliveryType);

    /**
     * 交易订单销售额对照
     *
     * @return 销售额对照
     */
    DataComparison<TradeOrderSummaryRespVO> getOrderComparison();

    /**
     * 获得订单量趋势统计
     *
     * @param reqVO 统计参数
     * @return 订单量趋势统计
     */
    List<DataComparison<TradeOrderTrendRespVO>> getOrderCountTrendComparison(TradeOrderTrendReqVO reqVO);

    /**
     * 获取产品销售排行榜
     *
     * @param limit 排行榜数量
     * @return 统计结果
     */
    List<TradeOrderProductRankingRespBO> getOrderProductRanking(Integer limit);

    /**
     * 获取用户消费排行榜
     *
     * @param limit 排行榜数量
     * @return 统计结果
     */
    List<TradeOrderMemberRankingRespBO> getOrderMemberRanking(Integer limit);

}
